package br.unicamp.ic.mc906.kmeans.test;

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import br.unicamp.ic.mc906.kmeans.KmeansInterface;

public class Message implements KmeansInterface<Message> {
	
	private double x;
	
	private double y;
	
	// Variavel referente ao nome do arquivo de texto
	private String name;
	
	// Variavel referente ao nome do grupo que o texto pertence
	private String group;
	
	// Variavel referente a todo texto do arquivo
	private String text;

	// Variavel referente a frequencia de cada palavra no texto
	private Map<String, Integer> frequencia; 
	
	// Variavel referente a maior frequencia das palavras do texto.
	private Map<String, Integer> maisFrequentes;
	
	
	public Message(){
		this.frequencia = new TreeMap<String,Integer>();
	};
	
	public Message(String name) {
		this.frequencia = new TreeMap<String, Integer>();
		this.name = name;
	}
	
	public Message(String fileName, String text) {
		this.name = fileName;
		this.text = text;
		this.frequencia = new TreeMap<String,Integer>();
	}
		
	public Message(double x, double y) {
		this.x = x;
		this.y = y;
	}
	
	@Override
	public Message centroidOfCluster(List<Message> elements) {
		double mediaX = 0;
		double mediaY = 0;
		
		for (Message m : elements){
			mediaX += m.getX();
			mediaY += m.getY();
		}
		
		mediaX = ((Number)(mediaX / elements.size())).intValue();
		mediaY = ((Number) (mediaY / elements.size())).intValue();
		
		return searchByXY(mediaX, mediaY, elements);
	}
	
	@Override
	public double getDistance(Message element) {
		return distancia2Pontos(this.x, element.getX(), this.y, element.getY());
	}
	
	public double getX() {
		return x;
	}

	public void setX(double x) {
		this.x = x;
	}

	public double getY() {
		return y;
	}

	public void setY(double y) {
		this.y = y;
	}
	
	public String toString() {
		NumberFormat nf = new DecimalFormat();
		nf.setMaximumFractionDigits(2);
		return "("+nf.format(this.x)+", "+nf.format(this.y)+")";
	}
	
	private Message searchByXY(double x, double y, List<Message> elements){
		Message retorno = null;
		int distancia = -1;
		int novaDist;
		
		for (Message m : elements){
			novaDist = distancia2Pontos(x, m.getX(), y, m.getY());
			if (distancia == -1 || novaDist < distancia){
				retorno = m;
				distancia = novaDist;
			}			
		}
		return retorno;
	}
	
	private int distancia2Pontos(double x1, double x2, double y1, double y2){
		double x = x1 - x2;
		double y = y1 - y2;
		
		x *= x;
		y *= y;

		double dist = Math.sqrt(x + y);
		
		return ((Number)dist).intValue();
	}
	

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getGroup() {
		return group;
	}

	public void setGroup(String group) {
		this.group = group;
	}

	public String getText() {
		return text;
	}

	public void setText(String text) {
		this.text = text;
	}

	public Map<String, Integer> getFrequencia() {
		return frequencia;
	}

	public void setFrequencia(Map<String, Integer> frequencia) {
		this.frequencia = frequencia;
	}

	public Map<String, Integer> getMaisFrequentes() {
		return maisFrequentes;
	}

	public void setMaisFrequentes(Map<String, Integer> maisFrequentes) {
		this.maisFrequentes = maisFrequentes;
	}

	
}
